package com.xiongwei.designPattern.chuangjianzhe;

import java.math.BigDecimal;

/**
 * 定义一个用于创建对象的接口,让子类决定实例化那一个类.
 * Factory Method是一个类的实例化延迟到其子类.
 *
 * @author XiongWei
 * @date 2021/1/26
 */
public class FactoryMethod {

    public static void main(String[] args) {
        /*
        调用放可以完全忽略真正的工厂NumberFactoryImpl和实际的产品BigDecimal,
        这样做的好处是允许创建产品的代码独立变换,而不影响到调用方
         */
        NumberFactory factory = NumberFactory.getFactory();
        Number parse = factory.parse("12.33");
        if (parse instanceof BigDecimal) {
            System.out.println("it is BigDecimal");
        }
        if (parse instanceof Double) {
            System.out.println("it is Double");
        }
        System.out.println(parse);
    }

    /*
    工厂模式可以隐藏创建产品的细节,且不一定每次都会真正创建产品,完全可以返回缓存的产品,从而提升速度并减少内存消耗
    常见的静态工厂方法:Integer.valueOf(), List.of()
     */
}

interface NumberFactory {

    public Number parse(String s);

    static NumberFactory getFactory() {
        return impl;
    }

    static NumberFactoryImpl impl = new NumberFactoryImpl();
}

class NumberFactoryImpl implements NumberFactory {

    @Override
    public Number parse(String s) {
        return new BigDecimal(s);
    }
}
